package DA;

import BO.Funcionario;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author David
 */
public class DAFuncionarios {

    String conexionString = "jdbc:sqlserver://localhost:1433;"
            + "databaseName=Viaticos;user=sa; password=admin;";

    Connection con = null;
    PreparedStatement pstmt = null;
    Statement stmt = null;
    ResultSet rs = null;

    public ResultSet getAllSups() throws SQLException {
        try {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            con = DriverManager.getConnection(conexionString);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(DAFuncionarios.class.getName()).log(Level.SEVERE, null, ex);
        }
        String query = "SELECT * FROM Funcionarios WHERE idRol = 3";
        Statement stmnt = con.createStatement();
        return stmnt.executeQuery(query);
    }

    public void insertarFuncionario(Funcionario F) throws SQLException {
        try {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            con = DriverManager.getConnection(conexionString);

            String SQL = "insert into Funcionarios values (?,?,?,?,?,?,?);";
            pstmt = con.prepareStatement(SQL);
            pstmt.setInt(1, F.getCedula());
            pstmt.setString(2, F.getNombre());
            pstmt.setString(3, F.getPrimerApellido());
            pstmt.setString(4, F.getSegundoApellido());
            pstmt.setInt(5, F.getUnidadProgramatica());
            pstmt.setInt(6, F.getAutoriza());
            pstmt.setInt(6+1, F.getIdRol());
            pstmt.executeUpdate();
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(DAFuncionarios.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            if (pstmt != null) {
                pstmt.close();
            }
        }

    }

    public ArrayList obtenerFuncionarios() throws SQLException {
        ArrayList lista = new ArrayList();
        try {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            con = DriverManager.getConnection(conexionString);
            stmt = con.createStatement();
            String SQL = "select  * from Funcionarios;";
            rs = stmt.executeQuery(SQL);
            while (rs.next()) {
                int cedula = rs.getInt("Cedula");
                String nombre = rs.getString("Nombre");
                String primerApellido = rs.getString("PrimerApellido");
                String segundoApellido = rs.getString("SegundoApellido");
                int unidad = rs.getInt("UnidadProgramatica");
                int autoriza = rs.getInt("Autoriza");
                int idRol = rs.getInt("idRol");
                Funcionario n = new Funcionario(cedula, nombre, primerApellido, segundoApellido, unidad, autoriza, idRol);
                lista.add(n);
            }
            con.close();
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(DAFuncionarios.class.getName()).log(Level.SEVERE, null, ex);
        }

        return lista;

    }

    public boolean existeFuncionario(int id) throws SQLException {
        int cedula = 0;
        try {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            con = DriverManager.getConnection(conexionString);
            String SQL = "select Cedula from Funcionarios where Cedula=?;";
            pstmt = con.prepareStatement(SQL);
            pstmt.setInt(1, id);
            rs = pstmt.executeQuery();

            while (rs.next()) {
                cedula = rs.getInt("Cedula");
            }
            con.close();
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(DAFuncionarios.class.getName()).log(Level.SEVERE, null, ex);
        }

        return cedula != 0;

    }

    public final boolean actualizarDatos(String campo, String dato, int cedula) throws SQLException {
        try {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            con = DriverManager.getConnection(conexionString);

            String SQL = "Update Funcionarios set " + campo + " =? where Cedula=?";
            pstmt = con.prepareStatement(SQL);
            if (campo.equals("Cedula") || campo.equals("Unidad Programática") || campo.equals("Autoriza")) {
                pstmt.setInt(1, Integer.parseInt(dato));
            } else {
                pstmt.setString(1, dato);
            }
            pstmt.setInt(2, cedula);
            pstmt.executeUpdate();
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(DAFuncionarios.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            if (pstmt != null) {
                pstmt.close();
            }
        }

        return true;

    }

    public ArrayList obtenerJefes() throws SQLException {
        ArrayList lista = new ArrayList();
        try {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            con = DriverManager.getConnection(conexionString);
            stmt = con.createStatement();
            String SQL = "select  * from Funcionarios where idRol=3;";
            rs = stmt.executeQuery(SQL);
            while (rs.next()) {
                int cedula = rs.getInt("Cedula");
                String nombre = rs.getString("Nombre");
                String primerApellido = rs.getString("PrimerApellido");
                String segundoApellido = rs.getString("SegundoApellido");
                int unidad = rs.getInt("UnidadProgramatica");
                int autoriza = rs.getInt("Autoriza");
                int idRol = rs.getInt("idRol");
                Funcionario n = new Funcionario(cedula, nombre, primerApellido, segundoApellido, unidad, autoriza, idRol);
                lista.add(n);
            }
            con.close();
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(DAFuncionarios.class.getName()).log(Level.SEVERE, null, ex);
        }

        return lista;

    }

    public void actualizarFuncionario(Funcionario f) throws SQLException {
        this.actualizarDatos("Nombre", f.getNombre(), f.getCedula());
        this.actualizarDatos("PrimerApellido", f.getPrimerApellido(), f.getCedula());
        this.actualizarDatos("SegundoApellido", f.getSegundoApellido(), f.getCedula());
        this.actualizarDatos("UnidadProgramatica", Integer.toString(f.getUnidadProgramatica()), f.getCedula());
        this.actualizarDatos("Autoriza", Integer.toString(f.getAutoriza()), f.getCedula());
        this.actualizarDatos("idRol", Integer.toString(f.getIdRol()), f.getCedula());

    }

}
